package com.mobile_fault_detector.controller;


import com.mobile_fault_detector.entity.Users;
import com.mobile_fault_detector.service.IUserService;
import com.mobile_fault_detector.utils.Result;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

/**
 * 用户控制器
 */
@Slf4j
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {

    private final IUserService IUserService;

    /**
     * 注册用户
     * @param users 用户信息
     * @return 注册成功的用户信息
     */
    @PostMapping("/register")
    public Result registerUser(@RequestBody Users users) {
        try {
            // 参数验证
            if (users == null) {
                return Result.fail("用户信息不能为空");
            }
            if (users.getPhoneNumber() == null || users.getPhoneNumber().trim().isEmpty()) {
                return Result.fail("手机号不能为空");
            }
            
            log.info("注册用户: {}", users);
            return Result.ok(IUserService.saveUser(users));
        } catch (Exception e) {
            log.error("注册用户失败，用户信息: {}, 异常信息: {}", users, e.getMessage(), e);
            String error = String.format("注册用户失败，时间：%s", LocalDateTime.now());
            return Result.fail(error);
        }
    }

    /**
     * 根据用户ID查询用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    @GetMapping("/getUser/{userId}")
    public Result getUserById(@PathVariable Long userId) {
        try {
            // 参数验证
            if (userId == null || userId <= 0) {
                return Result.fail("用户ID不能为空且必须大于0");
            }
            
            log.info("查询用户信息，用户ID: {}", userId);
            return Result.ok(IUserService.getUserById(userId));
        } catch (Exception e) {
            log.error("查询用户信息失败，用户ID: {}, 异常信息: {}", userId, e.getMessage(), e);
            String error = String.format("查询用户信息失败，用户ID：%d，时间：%s", userId, LocalDateTime.now());
            return Result.fail(error);
        }
    }

    /**
     * 根据手机号查询用户信息
     * @param phoneNumber 手机号
     * @return 用户信息
     */
    @GetMapping("/phone/{phoneNumber}")
    public Result getUserByPhoneNumber(@PathVariable String phoneNumber) {
        try {
            // 参数验证
            if (phoneNumber == null || phoneNumber.trim().isEmpty()) {
                return Result.fail("手机号不能为空");
            }
            // 简单的手机号格式验证
            if (!phoneNumber.matches("^1[3-9]\\d{9}$")) {
                return Result.fail("手机号格式不正确");
            }
            
            log.info("查询用户信息，手机号: {}", phoneNumber);
            return Result.ok(IUserService.getUserByPhoneNumber(phoneNumber));
        } catch (Exception e) {
            log.error("查询用户信息失败，手机号: {}, 异常信息: {}", phoneNumber, e.getMessage(), e);
            String error = String.format("查询用户信息失败，手机号：%s，时间：%s", phoneNumber, LocalDateTime.now());
            return Result.fail(error);
        }
    }
    
    /**
     * 更新用户信息
     * @param users 用户信息
     * @return 更新后的用户信息
     */
    @PutMapping("/update")
    public Result updateUser(@RequestBody Users users) {
        try {
            // 参数验证
            if (users == null) {
                return Result.fail("用户信息不能为空");
            }
            if (users.getUserId() == null || users.getUserId() <= 0) {
                return Result.fail("用户ID不能为空且必须大于0");
            }
            
            log.info("更新用户信息: {}", users);
            // 先查询用户是否存在
            Users existUser = IUserService.getUserById(users.getUserId());
            if (existUser == null) {
                return Result.fail("用户不存在");
            }
            
            return Result.ok(IUserService.saveUser(users));
        } catch (Exception e) {
            log.error("更新用户信息失败，用户信息: {}, 异常信息: {}", users, e.getMessage(), e);
            String error = String.format("更新用户信息失败，用户ID：%d，时间：%s", users.getUserId(), LocalDateTime.now());
            return Result.fail(error);
        }
    }

}